home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 November: Tool Chest / Dev.CD Nov 98 TC.toast / Tool Chest / Development Kits / MPW etc. / MPW-GM / Interfaces&Libraries / Interfaces / CIncludes / QD3DGroup.h < prev    next >
Encoding:
C/C++ Source or Header  |  1998-02-17  |  15.1 KB  |  501 lines  |  [TEXT/MPS ]

  1. /*
  2.      File:        QD3DGroup.h
  3.  
  4.      Contains:    Q3Group methods        
  5.  
  6.      Version:    Technology:    Quickdraw 3D 1.5.4
  7.                  Release:    Universal Interfaces 3.1
  8.  
  9.      Copyright:    © 1995-1998 by Apple Computer, Inc., all rights reserved.
  10.  
  11.      Bugs?:        Please include the the file and version information (from above) with
  12.                  the problem description.  Developers belonging to one of the Apple
  13.                  developer programs can submit bug reports to:
  14.  
  15.                      devsupport@apple.com
  16.  
  17. */
  18. #ifndef __QD3DGROUP__
  19. #define __QD3DGROUP__
  20.  
  21. #ifndef __QD3D__
  22. #include <QD3D.h>
  23. #endif
  24.  
  25.  
  26.  
  27. #if PRAGMA_ONCE
  28. #pragma once
  29. #endif
  30.  
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34.  
  35. #if PRAGMA_IMPORT
  36. #pragma import on
  37. #endif
  38.  
  39. #if PRAGMA_STRUCT_ALIGN
  40.     #pragma options align=power
  41. #elif PRAGMA_STRUCT_PACKPUSH
  42.     #pragma pack(push, 2)
  43. #elif PRAGMA_STRUCT_PACK
  44.     #pragma pack(2)
  45. #endif
  46.  
  47. #if PRAGMA_ENUM_ALWAYSINT
  48.     #pragma enumsalwaysint on
  49. #elif PRAGMA_ENUM_OPTIONS
  50.     #pragma option enum=int
  51. #elif PRAGMA_ENUM_PACK
  52.     #if __option(pack_enums)
  53.         #define PRAGMA_ENUM_PACK__QD3DGROUP__
  54.     #endif
  55.     #pragma options(!pack_enums)
  56. #endif
  57.  
  58. /******************************************************************************
  59.  **                                                                             **
  60.  **                            Group Typedefs                                     **
  61.  **                                                                             **
  62.  *****************************************************************************/
  63. /*
  64.  * These flags affect how a group is traversed
  65.  * They apply to when a group is "drawn", "picked", "bounded", "written"
  66.  */
  67.  
  68. enum TQ3DisplayGroupStateMasks {
  69.     kQ3DisplayGroupStateNone    = 0,
  70.     kQ3DisplayGroupStateMaskIsDrawn = 1 << 0,
  71.     kQ3DisplayGroupStateMaskIsInline = 1 << 1,
  72.     kQ3DisplayGroupStateMaskUseBoundingBox = 1 << 2,
  73.     kQ3DisplayGroupStateMaskUseBoundingSphere = 1 << 3,
  74.     kQ3DisplayGroupStateMaskIsPicked = 1 << 4,
  75.     kQ3DisplayGroupStateMaskIsWritten = 1 << 5
  76. };
  77. typedef enum TQ3DisplayGroupStateMasks TQ3DisplayGroupStateMasks;
  78.  
  79. typedef unsigned long                     TQ3DisplayGroupState;
  80. /******************************************************************************
  81.  **                                                                             **
  82.  **                    Group Routines (apply to all groups)                     **
  83.  **                                                                             **
  84.  *****************************************************************************/
  85. EXTERN_API_C( TQ3GroupObject )
  86. Q3Group_New                        (void);
  87.  
  88. EXTERN_API_C( TQ3ObjectType )
  89. Q3Group_GetType                    (TQ3GroupObject         group);
  90.  
  91. EXTERN_API_C( TQ3GroupPosition )
  92. Q3Group_AddObject                (TQ3GroupObject         group,
  93.                                  TQ3Object                 object);
  94.  
  95. EXTERN_API_C( TQ3GroupPosition )
  96. Q3Group_AddObjectBefore            (TQ3GroupObject         group,
  97.                                  TQ3GroupPosition         position,
  98.                                  TQ3Object                 object);
  99.  
  100. EXTERN_API_C( TQ3GroupPosition )
  101. Q3Group_AddObjectAfter            (TQ3GroupObject         group,
  102.                                  TQ3GroupPosition         position,
  103.                                  TQ3Object                 object);
  104.  
  105. EXTERN_API_C( TQ3Status )
  106. Q3Group_GetPositionObject        (TQ3GroupObject         group,
  107.                                  TQ3GroupPosition         position,
  108.                                  TQ3Object *            object);
  109.  
  110. EXTERN_API_C( TQ3Status )
  111. Q3Group_SetPositionObject        (TQ3GroupObject         group,
  112.                                  TQ3GroupPosition         position,
  113.                                  TQ3Object                 object);
  114.  
  115. EXTERN_API_C( TQ3Object )
  116. Q3Group_RemovePosition            (TQ3GroupObject         group,
  117.                                  TQ3GroupPosition         position);
  118.  
  119. EXTERN_API_C( TQ3Status )
  120. Q3Group_GetFirstPosition        (TQ3GroupObject         group,
  121.                                  TQ3GroupPosition *        position);
  122.  
  123. EXTERN_API_C( TQ3Status )
  124. Q3Group_GetLastPosition            (TQ3GroupObject         group,
  125.                                  TQ3GroupPosition *        position);
  126.  
  127. EXTERN_API_C( TQ3Status )
  128. Q3Group_GetNextPosition            (TQ3GroupObject         group,
  129.                                  TQ3GroupPosition *        position);
  130.  
  131. EXTERN_API_C( TQ3Status )
  132. Q3Group_GetPreviousPosition        (TQ3GroupObject         group,
  133.                                  TQ3GroupPosition *        position);
  134.  
  135. EXTERN_API_C( TQ3Status )
  136. Q3Group_CountObjects            (TQ3GroupObject         group,
  137.                                  unsigned long *        nObjects);
  138.  
  139. EXTERN_API_C( TQ3Status )
  140. Q3Group_EmptyObjects            (TQ3GroupObject         group);
  141.  
  142. /*
  143.  *     Typed Access
  144.  */
  145. EXTERN_API_C( TQ3Status )
  146. Q3Group_GetFirstPositionOfType    (TQ3GroupObject         group,
  147.                                  TQ3ObjectType             isType,
  148.                                  TQ3GroupPosition *        position);
  149.  
  150. EXTERN_API_C( TQ3Status )
  151. Q3Group_GetLastPositionOfType    (TQ3GroupObject         group,
  152.                                  TQ3ObjectType             isType,
  153.                                  TQ3GroupPosition *        position);
  154.  
  155. EXTERN_API_C( TQ3Status )
  156. Q3Group_GetNextPositionOfType    (TQ3GroupObject         group,
  157.                                  TQ3ObjectType             isType,
  158.                                  TQ3GroupPosition *        position);
  159.  
  160. EXTERN_API_C( TQ3Status )
  161. Q3Group_GetPreviousPositionOfType (TQ3GroupObject         group,
  162.                                  TQ3ObjectType             isType,
  163.                                  TQ3GroupPosition *        position);
  164.  
  165. EXTERN_API_C( TQ3Status )
  166. Q3Group_CountObjectsOfType        (TQ3GroupObject         group,
  167.                                  TQ3ObjectType             isType,
  168.                                  unsigned long *        nObjects);
  169.  
  170. EXTERN_API_C( TQ3Status )
  171. Q3Group_EmptyObjectsOfType        (TQ3GroupObject         group,
  172.                                  TQ3ObjectType             isType);
  173.  
  174. /*
  175.  *    Determine position of objects in a group
  176.  */
  177. EXTERN_API_C( TQ3Status )
  178. Q3Group_GetFirstObjectPosition    (TQ3GroupObject         group,
  179.                                  TQ3Object                 object,
  180.                                  TQ3GroupPosition *        position);
  181.  
  182. EXTERN_API_C( TQ3Status )
  183. Q3Group_GetLastObjectPosition    (TQ3GroupObject         group,
  184.                                  TQ3Object                 object,
  185.                                  TQ3GroupPosition *        position);
  186.  
  187. EXTERN_API_C( TQ3Status )
  188. Q3Group_GetNextObjectPosition    (TQ3GroupObject         group,
  189.                                  TQ3Object                 object,
  190.                                  TQ3GroupPosition *        position);
  191.  
  192. EXTERN_API_C( TQ3Status )
  193. Q3Group_GetPreviousObjectPosition (TQ3GroupObject         group,
  194.                                  TQ3Object                 object,
  195.                                  TQ3GroupPosition *        position);
  196.  
  197.  
  198. /******************************************************************************
  199.  **                                                                             **
  200.  **                            Group Subclasses                                 **
  201.  **                                                                             **
  202.  *****************************************************************************/
  203. EXTERN_API_C( TQ3GroupObject )
  204. Q3LightGroup_New                (void);
  205.  
  206. EXTERN_API_C( TQ3GroupObject )
  207. Q3InfoGroup_New                    (void);
  208.  
  209. /******************************************************************************
  210.  **                                                                             **
  211.  **                        Display Group Routines                                 **
  212.  **                                                                             **
  213.  *****************************************************************************/
  214. EXTERN_API_C( TQ3GroupObject )
  215. Q3DisplayGroup_New                (void);
  216.  
  217. EXTERN_API_C( TQ3ObjectType )
  218. Q3DisplayGroup_GetType            (TQ3GroupObject         group);
  219.  
  220. EXTERN_API_C( TQ3Status )
  221. Q3DisplayGroup_GetState            (TQ3GroupObject         group,
  222.                                  TQ3DisplayGroupState *    state);
  223.  
  224. EXTERN_API_C( TQ3Status )
  225. Q3DisplayGroup_SetState            (TQ3GroupObject         group,
  226.                                  TQ3DisplayGroupState     state);
  227.  
  228. EXTERN_API_C( TQ3Status )
  229. Q3DisplayGroup_Submit            (TQ3GroupObject         group,
  230.                                  TQ3ViewObject             view);
  231.  
  232. /******************************************************************************
  233.  **                                                                             **
  234.  **        Ordered Display Group                                                  **
  235.  **                                                                             **
  236.  **        Ordered display groups keep objects in order by the type of object:     **
  237.  **                                                                             **
  238.  **        1    kQ3ShapeTypeTransform                                             **
  239.  **        2    kQ3ShapeTypeStyle                                                  **
  240.  **        3    kQ3SetTypeAttribute                                                  **
  241.  **        4    kQ3ShapeTypeShader                                                  **
  242.  **        5    kQ3ShapeTypeCamera                                                  **
  243.  **        6    kQ3ShapeTypeLight                                                  **
  244.  **        7    kQ3ShapeTypeGeometry                                             **
  245.  **        8    kQ3ShapeTypeGroup                                                 **            
  246.  **        9    kQ3ShapeTypeUnknown                                                 **
  247.  **                                                                             **
  248.  **        Within a type, you are responsible for keeping things in order.         **
  249.  **                                                                             **
  250.  **        You may access and/or manipulate the group using the above types      **
  251.  **        (fast), or you may use any parent or leaf class types (slower).         **
  252.  **                                                                             **
  253.  **        Additional types will be added as functionality grows.                 **
  254.  **                                                                             **
  255.  **        The group calls which access by type are much faster for ordered     ** 
  256.  **        display group for the types above.                                     **
  257.  **                                                                             **
  258.  **        N.B. In QuickDraw 3D 1.0 Lights and Cameras are a no-op when drawn.     **
  259.  **                                                                             **
  260.  *****************************************************************************/
  261. EXTERN_API_C( TQ3GroupObject )
  262. Q3OrderedDisplayGroup_New        (void);
  263.  
  264. /******************************************************************************
  265.  **                                                                             **
  266.  **        IO Proxy Display Group                                                  **
  267.  **                                                                             **
  268.  **        IO Proxy display groups are used to place more than one              **
  269.  **        representation of an object in a metafile. For example, if you know     **
  270.  **        another program does not understand NURBPatches but does understand  **
  271.  **        Meshes, you may place a mesh and a NURB Patch in an IO Proxy Group,  **
  272.  **        and the reading program will select the desired representation.         **
  273.  **                                                                             **
  274.  **        Objects in an IO Proxy Display Group are placed in their preferencial**
  275.  **        order, with the FIRST object being the MOST preferred, the LAST      **
  276.  **        object the least preferred.                                             **
  277.  **                                                                             **
  278.  **        The behavior of an IO Proxy Display Group is that when drawn/picked/ **
  279.  **        bounded, the first object in the group that is not "Unknown" is used,**
  280.  **        and the other objects ignored.                                         **
  281.  **                                                                             **
  282.  *****************************************************************************/
  283. EXTERN_API_C( TQ3GroupObject )
  284. Q3IOProxyDisplayGroup_New        (void);
  285.  
  286. /******************************************************************************
  287.  **                                                                             **
  288.  **                        Group Extension Definitions                             **
  289.  **                                                                             **
  290.  *****************************************************************************/
  291. /*
  292.  *    Searching methods - OPTIONAL
  293.  */
  294.  
  295. enum {
  296.     kQ3XMethodType_GroupAcceptObject = FOUR_CHAR_CODE('gaco')
  297. };
  298.  
  299. typedef CALLBACK_API_C( TQ3Boolean , TQ3XGroupAcceptObjectMethod )(TQ3GroupObject group, TQ3Object object);
  300.  
  301. enum {
  302.     kQ3XMethodType_GroupAddObject = FOUR_CHAR_CODE('gado')
  303. };
  304.  
  305. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectMethod )(TQ3GroupObject group, TQ3Object object);
  306.  
  307. enum {
  308.     kQ3XMethodType_GroupAddObjectBefore = FOUR_CHAR_CODE('gaob')
  309. };
  310.  
  311. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectBeforeMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  312.  
  313. enum {
  314.     kQ3XMethodType_GroupAddObjectAfter = FOUR_CHAR_CODE('gaoa')
  315. };
  316.  
  317. typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectAfterMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  318.  
  319. enum {
  320.     kQ3XMethodType_GroupSetPositionObject = FOUR_CHAR_CODE('gspo')
  321. };
  322.  
  323. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupSetPositionObjectMethod )(TQ3GroupObject group, TQ3GroupPosition gPos, TQ3Object obj);
  324.  
  325. enum {
  326.     kQ3XMethodType_GroupRemovePosition = FOUR_CHAR_CODE('grmp')
  327. };
  328.  
  329. typedef CALLBACK_API_C( TQ3Object , TQ3XGroupRemovePositionMethod )(TQ3GroupObject group, TQ3GroupPosition position);
  330. /*
  331.  *    Searching methods - OPTIONAL - default uses above methods
  332.  */
  333.  
  334. enum {
  335.     kQ3XMethodType_GroupGetFirstPositionOfType = FOUR_CHAR_CODE('gfrt')
  336. };
  337.  
  338. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  339.  
  340. enum {
  341.     kQ3XMethodType_GroupGetLastPositionOfType = FOUR_CHAR_CODE('glst')
  342. };
  343.  
  344. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  345.  
  346. enum {
  347.     kQ3XMethodType_GroupGetNextPositionOfType = FOUR_CHAR_CODE('gnxt')
  348. };
  349.  
  350. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  351.  
  352. enum {
  353.     kQ3XMethodType_GroupGetPrevPositionOfType = FOUR_CHAR_CODE('gpvt')
  354. };
  355.  
  356. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  357.  
  358. enum {
  359.     kQ3XMethodType_GroupCountObjectsOfType = FOUR_CHAR_CODE('gcnt')
  360. };
  361.  
  362. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupCountObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, unsigned long *nObjects);
  363.  
  364. enum {
  365.     kQ3XMethodType_GroupEmptyObjectsOfType = FOUR_CHAR_CODE('geot')
  366. };
  367.  
  368. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEmptyObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType);
  369.  
  370. enum {
  371.     kQ3XMethodType_GroupGetFirstObjectPosition = FOUR_CHAR_CODE('gfop')
  372. };
  373.  
  374. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  375.  
  376. enum {
  377.     kQ3XMethodType_GroupGetLastObjectPosition = FOUR_CHAR_CODE('glop')
  378. };
  379.  
  380. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  381.  
  382. enum {
  383.     kQ3XMethodType_GroupGetNextObjectPosition = FOUR_CHAR_CODE('gnop')
  384. };
  385.  
  386. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  387.  
  388. enum {
  389.     kQ3XMethodType_GroupGetPrevObjectPosition = FOUR_CHAR_CODE('gpop')
  390. };
  391.  
  392. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  393. /*
  394.  *    Group Position Methods
  395.  *    
  396.  */
  397.  
  398. enum {
  399.     kQ3XMethodType_GroupPositionSize = FOUR_CHAR_CODE('ggpz')
  400. };
  401.  
  402. typedef unsigned long                     TQ3XMethodTypeGroupPositionSize;
  403.  
  404. enum {
  405.     kQ3XMethodType_GroupPositionNew = FOUR_CHAR_CODE('ggpn')
  406. };
  407.  
  408. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionNewMethod )(void *gPos, TQ3Object object, const void *initData);
  409.  
  410. enum {
  411.     kQ3XMethodType_GroupPositionCopy = FOUR_CHAR_CODE('ggpc')
  412. };
  413.  
  414. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionCopyMethod )(void *srcGPos, void *dstGPos);
  415.  
  416. enum {
  417.     kQ3XMethodType_GroupPositionDelete = FOUR_CHAR_CODE('ggpd')
  418. };
  419.  
  420. typedef CALLBACK_API_C( void , TQ3XGroupPositionDeleteMethod )(void *gPos);
  421. /*
  422.  *    View Drawing Helpers
  423.  *    
  424.  *    TQ3XGroupStartIterateMethod
  425.  *
  426.  *        Pass back *object = NULL to NOT call EndIterate iterate
  427.  *        Pass back *object != NULL to draw object
  428.  *         (other side will pass it to EndIterate for deletion!)
  429.  *
  430.  *        *iterator is uninitialized, use for iteration state. Caller should 
  431.  *         ignore it.
  432.  *    
  433.  *    TQ3XGroupEndIterateMethod
  434.  *    
  435.  *        *object is previous object, dispose it or play with it.
  436.  *        Pass back NULL when last iteration has occurred
  437.  *        *iterator is previous value, use for iteration state Caller should 
  438.  *        ignore it.
  439.  */
  440.  
  441. enum {
  442.     kQ3XMethodType_GroupStartIterate = FOUR_CHAR_CODE('gstd')
  443. };
  444.  
  445. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupStartIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
  446.  
  447. enum {
  448.     kQ3XMethodType_GroupEndIterate = FOUR_CHAR_CODE('gitd')
  449. };
  450.  
  451. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
  452. /*
  453.  *    IO  Helpers
  454.  *    
  455.  *    TQ3XGroupEndReadMethod
  456.  *        Called when a group has been completely read. Group should perform
  457.  *        validation and clean up any reading caches.
  458.  */
  459.  
  460. enum {
  461.     kQ3XMethodType_GroupEndRead    = FOUR_CHAR_CODE('gerd')
  462. };
  463.  
  464. typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndReadMethod )(TQ3GroupObject group);
  465. EXTERN_API_C( void *)
  466. Q3XGroup_GetPositionPrivate        (TQ3GroupObject         group,
  467.                                  TQ3GroupPosition         position);
  468.  
  469.  
  470.  
  471.  
  472.  
  473. #if PRAGMA_ENUM_ALWAYSINT
  474.     #pragma enumsalwaysint reset
  475. #elif PRAGMA_ENUM_OPTIONS
  476.     #pragma option enum=reset
  477. #elif defined(PRAGMA_ENUM_PACK__QD3DGROUP__)
  478.     #pragma options(pack_enums)
  479. #endif
  480.  
  481. #if PRAGMA_STRUCT_ALIGN
  482.     #pragma options align=reset
  483. #elif PRAGMA_STRUCT_PACKPUSH
  484.     #pragma pack(pop)
  485. #elif PRAGMA_STRUCT_PACK
  486.     #pragma pack()
  487. #endif
  488.  
  489. #ifdef PRAGMA_IMPORT_OFF
  490. #pragma import off
  491. #elif PRAGMA_IMPORT
  492. #pragma import reset
  493. #endif
  494.  
  495. #ifdef __cplusplus
  496. }
  497. #endif
  498.  
  499. #endif /* __QD3DGROUP__ */
  500.  
  501.